package capaPresentacion.client.vista;

import java.util.List;

import capaPresentacion.client.presentador.PresentadorAdministrador;
import capaPresentacion.shared.ComentarioDTO;
import capaPresentacion.shared.RutaDTO;
import capaPresentacion.shared.UsuarioDTO;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class VistaAdministrador extends Composite implements
		PresentadorAdministrador.Display {

	// Paneles
	private final DockPanel panelPrincipal;
	private final FlexTable banerDerecho, banerIzquierdo, banerInferior;
	private final SimplePanel titulo, icono;
	private final HorizontalPanel panelSuperior;
	private final MenuBar panelIzquierdo;
	private final VerticalPanel panelDerecho, panelInferior,
			panelContenedorIzquierdo;

	// Panel central
	private final DeckPanel panelCentral;
	private final Button botonEliminarUsuario, botonEliminarRuta,
			botonVerComentarios, botonEliminarComentario;
	private final FlexTable tablaBusquedaRuta, tablaBusquedaUsuario,
			tablaResultadoBusquedaUsuario, tablaResultadoBusquedaRuta,
			tablaAux, tablaComentarios;

	// Menu derecho
	private final MenuItem itemRutas;
	private final MenuItem itemUsuarios;
	private final MenuItem itemLogout;

	// Pop-up
	private final DialogBox busquedaRuta, busquedaUsuario;
	private final Button botonBuscarDialogoRuta, botonBuscarDialogoUsuario,
			botonCerrarDialogoRuta, botonCerrarDialogoUsuario;
	private final TextBox usuarioABuscar, rutaABuscar;

	private String usuarioAEliminar;
	private Long ruta;
	private Long comentarioAEliminar;

	public VistaAdministrador() {

		// Paneles
		panelPrincipal = new DockPanel();
		panelSuperior = new HorizontalPanel();
		panelInferior = new VerticalPanel();
		panelIzquierdo = new MenuBar(true);
		panelDerecho = new VerticalPanel();
		panelCentral = new DeckPanel();
		banerDerecho = new FlexTable();
		banerIzquierdo = new FlexTable();
		banerInferior = new FlexTable();
		panelContenedorIzquierdo = new VerticalPanel();
		titulo = new SimplePanel();
		icono = new SimplePanel();
		titulo.add(new Image("images/Titulo.png"));
		icono.add(new Image("images/IconoPequeno.png"));

		// Panel central
		botonEliminarUsuario = new Button("Eliminar");
		botonEliminarRuta = new Button("Eliminar");
		botonVerComentarios = new Button("Ver Comentarios");
		botonEliminarComentario = new Button("Eliminar");
		tablaResultadoBusquedaRuta = new FlexTable();
		tablaResultadoBusquedaUsuario = new FlexTable();
		tablaAux = new FlexTable();
		tablaComentarios = new FlexTable();

		// Menu derecho
		itemUsuarios = new MenuItem("Usuarios", new Command() {

			@Override
			public void execute() {
				usuarioAEliminar = "Ninguno";
				ruta = (long) -1;
				comentarioAEliminar = (long) -1;
				usuarioABuscar.setText("");
				rutaABuscar.setText("");
				busquedaUsuario.show();
			}
		});
		itemRutas = new MenuItem("Rutas", new Command() {

			@Override
			public void execute() {
				usuarioAEliminar = "Ninguno";
				ruta = (long) -1;
				comentarioAEliminar = (long) -1;
				usuarioABuscar.setText("");
				rutaABuscar.setText("");
				busquedaRuta.show();
			}
		});
		itemLogout = new MenuItem("Salir", new Command() {

			@Override
			public void execute() {
				logout();
			}
		});

		// Pop-up
		botonBuscarDialogoRuta = new Button("Buscar");
		botonBuscarDialogoUsuario = new Button("Buscar");
		botonCerrarDialogoRuta = new Button("Cancelar");
		botonCerrarDialogoUsuario = new Button("Cancelar");
		busquedaRuta = new DialogBox();
		rutaABuscar = new TextBox();
		busquedaUsuario = new DialogBox();
		usuarioABuscar = new TextBox();

		itemLogout.getElement().setId("item1");
		itemUsuarios.getElement().setId("item2");
		itemRutas.getElement().setId("item3");

		banerInferior.setText(0, 75,
				"2012 PFC World's Trainer | J.D. del Moral | R. González");

		panelInferior.add(banerInferior);
		panelInferior.setCellHorizontalAlignment(banerInferior,
				HasHorizontalAlignment.ALIGN_CENTER);
		panelInferior.setCellVerticalAlignment(banerInferior,
				HasVerticalAlignment.ALIGN_MIDDLE);

		panelCentral.add(tablaResultadoBusquedaRuta);
		panelCentral.add(tablaResultadoBusquedaUsuario);
		panelCentral.add(tablaAux);
		panelCentral.add(tablaComentarios);
		panelCentral.getElement().setId("panelCentral");

		tablaBusquedaUsuario = new FlexTable();
		tablaBusquedaUsuario.setText(1, 1, "Nombre usuario a buscar: ");
		tablaBusquedaUsuario.setWidget(1, 2, usuarioABuscar);
		tablaBusquedaUsuario.setWidget(1, 3, botonBuscarDialogoUsuario);
		tablaBusquedaUsuario.setWidget(4, 3, botonCerrarDialogoUsuario);

		tablaBusquedaRuta = new FlexTable();
		tablaBusquedaRuta.setText(1, 1, "Nombre ruta a buscar: ");
		tablaBusquedaRuta.setWidget(1, 2, rutaABuscar);
		tablaBusquedaRuta.setWidget(1, 3, botonBuscarDialogoRuta);
		tablaBusquedaRuta.setWidget(4, 3, botonCerrarDialogoRuta);

		busquedaRuta.setText("Busqueda ruta ");
		busquedaRuta.add(tablaBusquedaRuta);
		busquedaRuta.setAnimationEnabled(true);
		busquedaRuta.hide();
		busquedaRuta.center();

		busquedaUsuario.setText("Busqueda usuario:");
		busquedaUsuario.add(tablaBusquedaUsuario);
		busquedaUsuario.setAnimationEnabled(true);
		busquedaUsuario.hide();
		busquedaUsuario.center();

		usuarioAEliminar = "Ninguno";
		ruta = (long) -1;
		comentarioAEliminar = (long) -1;

		banerDerecho.setWidth("150px");
		banerIzquierdo.setWidth("150px");
		panelCentral.setWidth("600px");
		panelCentral.setHeight("400px");
		panelInferior.setHeight("150px");
		panelDerecho.setWidth("150px");
		panelSuperior.setHeight("110px");
		panelIzquierdo.setWidth("150px");
		icono.setHeight("110px");
		icono.setWidth("160px");
		titulo.setHeight("110px");
		titulo.setWidth("600px");

		panelSuperior.add(icono);
		panelSuperior.add(titulo);
		panelSuperior.setCellHorizontalAlignment(icono,
				HasHorizontalAlignment.ALIGN_CENTER);
		panelSuperior.setCellVerticalAlignment(icono,
				HasVerticalAlignment.ALIGN_BOTTOM);
		panelSuperior.setCellHorizontalAlignment(titulo,
				HasHorizontalAlignment.ALIGN_CENTER);

		panelIzquierdo.addItem(itemRutas);
		panelIzquierdo.addItem(itemUsuarios);
		panelIzquierdo.addItem(itemLogout);

		panelContenedorIzquierdo.getElement().setId("panelIzquierdo");
		panelContenedorIzquierdo.add(panelIzquierdo);

		panelPrincipal.add(banerIzquierdo, DockPanel.WEST);
		panelPrincipal.add(banerDerecho, DockPanel.EAST);
		panelPrincipal.add(panelSuperior, DockPanel.NORTH);
		panelPrincipal.add(panelInferior, DockPanel.SOUTH);
		panelPrincipal.add(panelContenedorIzquierdo, DockPanel.WEST);
		panelPrincipal.add(panelDerecho, DockPanel.EAST);
		panelPrincipal.add(panelCentral, DockPanel.CENTER);

		botonCerrarDialogoRuta.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				rutaABuscar.setText("");
				busquedaRuta.hide();

			}
		});
		botonCerrarDialogoUsuario.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				usuarioABuscar.setText("");
				busquedaUsuario.hide();

			}
		});
		initWidget(panelPrincipal);
	}

	@Override
	public MenuItem logout() {
		return itemLogout;
	}

	@Override
	public HasClickHandlers getBotonBuscarDialogoRuta() {
		return botonBuscarDialogoRuta;
	}

	@Override
	public HasClickHandlers getBotonEliminarComentario() {
		return botonEliminarComentario;
	}

	@Override
	public HasClickHandlers getBotonBuscarDialogoUsuario() {
		return botonBuscarDialogoUsuario;
	}

	@Override
	public HasClickHandlers getBotonEliminarRuta() {
		return botonEliminarRuta;
	}

	@Override
	public HasClickHandlers getBotonEliminarUsuario() {
		return botonEliminarUsuario;
	}

	@Override
	public HasClickHandlers getBotonVerComentarios() {
		return botonVerComentarios;
	}

	@Override
	public HasValue<String> getNombreRutaBusqueda() {
		return rutaABuscar;
	}

	@Override
	public HasValue<String> getNombreUsuarioBusqueda() {
		return usuarioABuscar;
	}

	@Override
	public Long getIdRuta() {
		return ruta;
	}

	@Override
	public void resetIdRutaAEliminar() {
		ruta = (long) -1;
	}

	@Override
	public void resetEmailUsuarioAEliminar() {
		usuarioAEliminar = "Ninguno";
	}

	public void resetComentarioAEliminar() {
		comentarioAEliminar = (long) -1;
	}

	@Override
	public String getEmailUsuarioAEliminar() {
		return usuarioAEliminar;
	}

	@Override
	public Long getIdComentarioAEliminar() {
		return comentarioAEliminar;
	}

	@Override
	public void buscarRuta(List<RutaDTO> rutasDTO) {
		tablaResultadoBusquedaRuta.clear(true);
		tablaResultadoBusquedaRuta.setText(2, 1, "Nombre");
		tablaResultadoBusquedaRuta.setText(2, 2, "Distancia");
		tablaResultadoBusquedaRuta.setText(2, 3, "Tipo");
		int i = 3;
		for (final RutaDTO rutaDTO : rutasDTO) {
			tablaResultadoBusquedaRuta.setText(i, 1, rutaDTO.getNombre());
			tablaResultadoBusquedaRuta.setText(i, 2,
					String.valueOf(getDecimal(rutaDTO.getDistancia())) + " km");
			tablaResultadoBusquedaRuta.setText(i, 3, rutaDTO.getTipo());
			RadioButton radioButtonRuta = new RadioButton("radioButtonRuta");
			tablaResultadoBusquedaRuta.setWidget(i, 2, radioButtonRuta);
			radioButtonRuta.addClickHandler(new ClickHandler() {

				@Override
				public void onClick(ClickEvent event) {
					ruta = rutaDTO.getId();
				}
			});
			i++;
		}
		tablaResultadoBusquedaRuta.setWidget(i + 1, 2, botonEliminarRuta);
		tablaResultadoBusquedaRuta.setWidget(i + 1, 1, botonVerComentarios);
		panelCentral.showWidget(0);
	}

	@Override
	public void buscarUsuario(List<UsuarioDTO> usuariosDTO) {
		tablaResultadoBusquedaUsuario.clear(true);
		tablaResultadoBusquedaUsuario.setText(2, 1, "Nombre");
		tablaResultadoBusquedaUsuario.setText(2, 2, "Apellidos");
		tablaResultadoBusquedaUsuario.setText(2, 3, "Email");
		int i = 3;
		for (final UsuarioDTO usuarioDTO : usuariosDTO) {
			tablaResultadoBusquedaUsuario.setText(i, 1, usuarioDTO.getNombre());
			tablaResultadoBusquedaUsuario.setText(i, 2,
					usuarioDTO.getApellidos());
			tablaResultadoBusquedaUsuario.setText(i, 3, usuarioDTO.getEmail());
			RadioButton radioButton = new RadioButton("radioButtonUsuario");
			tablaResultadoBusquedaUsuario.setWidget(i, 4, radioButton);
			radioButton.addClickHandler(new ClickHandler() {

				@Override
				public void onClick(ClickEvent event) {
					usuarioAEliminar = usuarioDTO.getEmail();
				}
			});
			i++;
		}
		tablaResultadoBusquedaUsuario.setWidget(i + 1, 4, botonEliminarUsuario);
		panelCentral.showWidget(1);
	}

	@Override
	public void comentarios(List<ComentarioDTO> comentariosDTO) {
		tablaComentarios.clear(true);
		tablaComentarios.setText(0, 0, "Fecha");
		tablaComentarios.setText(0, 1, "Ruta");
		tablaComentarios.setText(0, 2, "Usuario");
		tablaComentarios.setText(0, 3, "Email");
		tablaComentarios.setText(0, 4, "Comentario");
		int i = 2;
		for (final ComentarioDTO comentarioDTO : comentariosDTO) {
			tablaComentarios.setText(i, 0,
					String.valueOf(comentarioDTO.getFecha()));
			tablaComentarios.setText(i, 1, comentarioDTO.getRuta().getNombre());
			tablaComentarios.setText(i, 2, comentarioDTO.getUsuario()
					.getNombre());
			tablaComentarios.setText(i, 3, comentarioDTO.getUsuario()
					.getEmail());
			tablaComentarios.setText(i, 4, comentarioDTO.getTexto());
			RadioButton radioButtonComentario = new RadioButton(
					"radioButtonComentario");
			tablaComentarios.setWidget(i, 5, radioButtonComentario);
			radioButtonComentario.addClickHandler(new ClickHandler() {

				@Override
				public void onClick(ClickEvent event) {
					comentarioAEliminar = comentarioDTO.getIdComentario();
				}
			});
			tablaComentarios.setWidget(i + 1, 5, botonEliminarComentario);
			i++;
		}
		panelCentral.showWidget(3);
	}

	@Override
	public void ocultarDialogo(String rutaOUsuario) {
		if (rutaOUsuario.equals("Ruta"))
			busquedaRuta.hide();
		else
			busquedaUsuario.hide();
	}

	protected double getDecimal(double decimal) {
		decimal = decimal * (java.lang.Math.pow(10, 2));
		decimal = java.lang.Math.round(decimal);
		decimal = decimal / java.lang.Math.pow(10, 2);
		return decimal;
	}
}
